package com.freedy.concurrent.Monitors.biaslock;

import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;

/**
 * 撤销 - 其它线程使用对象
 * 添加虚拟机参数 -XX:BiasedLockingStartupDelay=0
 * @author Freedy
 * @date 2021/4/21 20:21
 */
@Slf4j
public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        Dog d = new Dog();
        Thread t1 = new Thread(() -> {
            log.debug(ClassLayout.parseInstance(d).toPrintable());
            synchronized (d) {
                log.debug(ClassLayout.parseInstance(d).toPrintable());
            }
            log.debug(ClassLayout.parseInstance(d).toPrintable());
            synchronized (Test2.class) {
                Test2.class.notify();
            }
        // 如果不用 wait/notify 使用 join 必须打开下面的注释
        // 因为：t1 线程不能结束，否则底层线程可能被 jvm 重用作为 t2 线程，底层线程 id 是一样的
        /*try {
        System.in.read();
        } catch (IOException e) {
        e.printStackTrace();
        }*/
        }, "t1");
        t1.start();

        Thread t2 = new Thread(() -> {
            synchronized (Test2.class) {
                try {
                    Test2.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            log.debug(ClassLayout.parseInstance(d).toPrintable());
            synchronized (d) {
                log.debug(ClassLayout.parseInstance(d).toPrintable());
            }
            log.debug(ClassLayout.parseInstance(d).toPrintable());
        }, "t2");
        t2.start();

    }
}
